<?php
defined('IN_YZMPHP') or exit('Access Denied');
class jst{
	public $url = 'https://openapi.jushuitan.com';
	public $url_auth = "https://openweb.jushuitan.com";
	public $config = [];
	public $company = '';
	public $path = [
		'auth' => '/auth',//授权路劲
		'token' => '/openWeb/auth/accessToken',//授权令牌access_token获取路劲
		'refresh_token' => '/openWeb/auth/refreshToken',//更新授权令牌获取路劲
		'shop' => '/open/shops/query', //获取店铺信息
		'wms' => '/open/wms/partner/query',//仓库信息查询
		'skumap' => '/open/skumap/query',//店铺商品资料查询
		'category' => '/open/category/query',//商品类目查询
		'item' => '/open/mall/item/query',//普通商品查询（按款查询）
		'sku' => '/open/sku/query',//普通商品查询（按商品编码查询）
		'inventorys' => '/open/inventory/query',//库存查询
		'orders' => '/open/orders/single/query',//订单查询
		'allocate' => '/open/allocate/query',//调拨单查询
		'supplier' => '/open/supplier/query',//供应商查询
		'otherinout' => '/open/jushuitan/otherinout/upload',//新建其它出入库（新）
		'pack_query' => '/open/pack/query', //箱及仓位库存查询
		'order_action'=>'/open/order/action/query',//订单操作日记
		'purchase'=>'/open/purchase/query',//采购单查询
		'purchasein'=>'/open/purchasein/query',//采购入库查询
		'authorization_code'=>'/openWeb/auth/getInitToken'//自有应用，获取access_token、refresh_token
	];
	
	//初始化，读取配置
    public function __construct($company=''){
		$this->config = get_config();
		if($company){
			$this->company = $company;
		}
    }
	
	//基础接口：获取授权链接
	public function auth(){
		$arr = [
			'app_key' => $this->config['jst'.$this->company.'_app_key'],
			'timestamp' => time(),
			'charset' => 'utf-8',
			'state' => $this->company?$this->company:'company',
		];
		$arr['sign'] = $this->sign($arr);
		$url = $this->url_auth.$this->path['auth'].'?'.http_build_query($arr);
		return $url;
	}
	
	//基础接口：使用授权后聚水潭返回code，获取授权令牌access_token
	public function token($code){
		$arr = [
			'app_key' => $this->config['jst'.$this->company.'_app_key'],
			'timestamp' => time(),
			'grant_type' => 'authorization_code',
			'charset' => 'utf-8',
			'code' => $code,
		];
		$arr['sign'] = $this->sign($arr);
		$result = $this->post($this->url.$this->path['token'],$arr);
		$result = json_decode($result,true);
		return $result;
	}
	
	//基础接口：使用refresh_token，获取授权令牌access_token
	public function refresh_token(){
		$arr = [
			'app_key' => $this->config['jst'.$this->company.'_app_key'],
			'timestamp' => time(),
			'grant_type' => 'refresh_token',
			'charset' => 'utf-8',
			'refresh_token' => $this->config['jst'.$this->company.'_refresh_token'],
			'scope' => 'scope',
		];
		$arr['sign'] = $this->sign($arr);
		$result = $this->post($this->url.$this->path['refresh_token'],$arr);
		$result = json_decode($result,true);
		return $result;
	}
	
	public function authorization_code(){
		$arr = [
			'app_key' => $this->config['jst'.$this->company.'_app_key'],
			'timestamp' => time(),
			'grant_type' => 'authorization_code',
			'charset' => 'utf-8',
			'code' => 'scope',
		];
		$arr['sign'] = $this->sign($arr);
		$result = $this->post($this->url.$this->path['authorization_code'],$arr);
		$result = json_decode($result,true);
		return $result;
	}
	
	/*  店铺查询
		参数名称		参数类型 是否必填	参数描述
		app_key         String	 必填       POP分配给应用的app_key
		access_token	String	 必填       通过code获取的access_token
		timestamp	    Long	 必填       UNIX时间戳，单位秒，需要与聚水潭服务器时间差值在10分钟内
		charset	        String	 必填       字符编码（固定值：utf-8）
		version	        String   必填       版本号，固定传2
		sign	        String	 必填       数字签名
		biz（请求体）
		page_index  	int	     非必填     第几页，默认第一页
		page_size	    int	     非必填     每页多少条；默认100条，最大100条
		nicks       	list	 非必填     店铺主账号，不支持模糊查询，非必填项，默认查所有
	*/
	public function shop(){
		$arr = [
			"page_index" => 1,
			"page_size" => 100,
			"nicks" => []
		];
		$result = $this->request('shop',$arr);
		return $result;
	}
	
	/*  仓库查询
		biz（请求体）
		page_index  	int	     非必填     第几页，默认第一页
		page_size	    int	     非必填     每页多少条；默认30条
	*/
	public function wms(){
		$arr = [
			"page_index" => 1,
			"page_size" => 100
		];
		$result = $this->request('wms',$arr);
		return $result;
	}
	
	/*  店铺商品资料查询
		参数名称		参数类型 是否必填	参数描述
		biz（请求体）
		page_index  	int	     非必填     第几页，默认第一页
		page_size	    int	     非必填     每页多少条，默认30，最大50
		modified_begin	string	 非必填     修改起始时间，和结束时间必须同时存在，时间间隔不能超过七天，与商品编码不能同时为空
		modified_end	string   非必填     修改结束时间，和起始时间必须同时存在，时间间隔不能超过七天，与商品编码不能同时为空
		sku_ids	        string	 非必填     商品编码，与修改时间不能同时为空，最多20
		shop_id	        integer	 非必填     店铺编号
	*/
	public function skumap($arr){
		$result = $this->request('skumap',$arr);
		return $result;
	}
	
	/*  商品类目查询
		参数名称		参数类型 是否必填	参数描述
		biz（请求体）
		page_index  	int	     非必填     第几页，默认第一页
		page_size	    int	     非必填     每页多少条，默认30，最大50
		modified_begin	string	 非必填     修改起始时间，和结束时间必须同时存在，时间间隔不能超过七天，与商品编码不能同时为空
		modified_end	string   非必填     修改结束时间，和起始时间必须同时存在，时间间隔不能超过七天，与商品编码不能同时为空
		items	        array	 非必填     类目id集合
	*/
	public function category($arr){
		$result = $this->request('category',$arr);
		return $result;
	}

	/*  普通商品查询（按款查询）
		参数名称		参数类型 是否必填	参数描述
		biz（请求体）
		page_index  	int	     非必填     第几页，默认第一页
		page_size	    int	     非必填     每页多少条，默认30，最大50
		modified_begin	string	 非必填     修改起始时间，和结束时间必须同时存在，时间间隔不能超过七天，与商品编码不能同时为空
		modified_end	string   非必填     修改结束时间，和起始时间必须同时存在，时间间隔不能超过七天，与商品编码不能同时为空
		items	        array	 非必填     款式编码，与修改时间不能同时为空，最多20
	*/
	public function item($arr){
		$result = $this->request('item',$arr);
		return $result;
	}
	
	/*jeep获取商品信息*/
	public function item_jeep($arr){
		$result = $this->request('item',$arr);
		return $result;
	}
	
	/*  普通商品资料查询（按sku查询）
		参数名称		参数类型 是否必填	参数描述
		biz（请求体）
		page_index  	int	     非必填     第几页，默认第一页
		page_size	    int	     非必填     每页多少条，默认30，最大50
		modified_begin	string	 非必填     修改起始时间，和结束时间必须同时存在，时间间隔不能超过七天，与商品编码不能同时为空
		modified_end	string   非必填     修改结束时间，和起始时间必须同时存在，时间间隔不能超过七天，与商品编码不能同时为空
		sku_ids	        string	 非必填     商品编码，与修改时间不能同时为空，最多20
		shop_id	        integer	 非必填     店铺编号
	*/
	public function sku($arr){
		$result = $this->request('sku',$arr);
		return $result;
	}
	
	//库存查询
	public function inventorys($arr){
		$result = $this->request('inventorys',$arr);
		return $result;
	}
	
	//订单查询
	public function orders($arr){
		$result = $this->request('orders',$arr);
		return $result;
	}
	
	//调拨查询
	public function allocate($arr){
		$result = $this->request('allocate',$arr);
		return $result;
	}
	
	//供应商查询
	public function supplier(){
		$arr = [
			"page_index" => 1,
			"page_size" => 500
		];
		$result = $this->request('supplier',$arr);
		return $result;
	}
	
	public function pack_query($arr){
		$result = $this->request('pack_query',$arr);
		return $result;
	}
	
	public function otherinout($arr){
		$result = $this->request('otherinout',$arr);
		return $result;
	}
	
	public function order_action($arr){
		$result = $this->request('order_action',$arr);
		return $result;
	}
	
	public function purchase($arr){
		$result = $this->request('purchase',$arr);
		return $result;
	}
	
	public function purchasein($arr){
		$result = $this->request('purchasein',$arr);
		return $result;
	}
	
	/*	公用请求
		参数名称		参数类型 是否必填	参数描述
		app_key	        String	 必填		POP分配给应用的app_key
		access_token	String	 必填       通过code获取的access_token
		timestamp	    Long     必填		UNIX时间戳，单位秒，需要与聚水潭服务器时间差值在10分钟内
		charset	        String   必填       字符编码（固定值：utf-8）
		version	        String   必填       版本号，固定传2
		sign	        String   必填       数字签名
	*/
	public function request($type,$arr){
		$time = microtime(true);
		$arr = [
			'app_key' => $this->config['jst'.$this->company.'_app_key'],
			'access_token' => $this->config['jst'.$this->company.'_access_token'],
			'timestamp' => time(),
			'charset' => 'utf-8',
			'version' => 2,
			'biz' => json_encode($arr),
		];
		//var_dump($arr);exit;
		$arr['sign'] = $this->sign($arr);
		$result = $this->post($this->url.$this->path[$type],$arr);
		$result = json_decode($result,true);
		$msg = 'code:'.$result['code'].',msg:'.$result['msg'];
		//获取数据统计
		$count = 0;
		if(isset($result['data'])){
			if(isset($result['data']['orders'])){
				$count = count($result['data']['orders']);
			}elseif(isset($result['data']['inventorys'])){
				$count = count($result['data']['inventorys']);
			}elseif(isset($result['data']['datas'])){
				$count = count($result['data']['datas']);
			}
		}
		//插入查询记录
		/*
		D('jst_request_log')->insert([
			'url' => $this->path[$type],
			'request_time' => intval((microtime(true)-$time)*1000),
			'add_time'=>time(),
			'request'=>json_encode($arr['biz']),
			'response'=>json_encode($result['data']).'code:'.$result['code'].',msg:'.$result['msg'].',共获取到'.$count.'条数据',
		]);*/
		return $result;
	}
	
	/*签名*/
	public function sign($data){
		if ($data == null) {
			return null;
		}
		ksort($data);
		$result_str = "";
		foreach ($data as $key => $val) {
			if ( $key != null && $key != "" && $key != "sign" ) {
				$result_str = $result_str . $key . $val;
			}
		}
		$result_str = $this->config['jst'.$this->company.'_app_secret'] . $result_str;
		$ret = bin2hex(md5($result_str, true));
		return $ret;
	}
	
	/*请求*/
	private function post($url,$data){
		$curl = curl_init();
		curl_setopt_array($curl, array(
		  CURLOPT_URL => $url,
		  CURLOPT_RETURNTRANSFER => true,
		  CURLOPT_ENCODING => "",
		  CURLOPT_MAXREDIRS => 10,
		  CURLOPT_TIMEOUT => 30,
		  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
		  CURLOPT_CUSTOMREQUEST => "POST",
		  CURLOPT_POSTFIELDS => http_build_query($data),
		  CURLOPT_HTTPHEADER => array(
			"Content-Type:application/x-www-form-urlencoded"
		  ),
		));
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //验证curl对等证书(一般只要此项)
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); //检查服务器SSL证书中是否存在一个公用名
		curl_setopt($curl, CURLOPT_SSLVERSION, 0); //传递一个包含SSL版本的长参数。
		$response = curl_exec($curl);
		$err = curl_error($curl);
		curl_close($curl);
		if ($err) {
		  return '{"code":1,"msg":系统错误：'.$err.'}';
		} else {
		  return $response;
		}
	}
}

